#pragma once
#ifndef _EVENTS_H_
#define _EVENTS_H_
#include "IEventData.h"
class MouseInputDataBase :public IEventData
{
private: 
	const char* m_Name;
	float m_x;
	float m_y;
public:
	MouseInputDataBase(float x, float y) :m_x(x), m_y(y) { m_Name = "Mouse Event"; }
	virtual const EventType& VGetEventType(void) const { return sk_eventType; }
	virtual const char* GetName(void) const { return m_Name; }
	float GetX() const { return m_x; }
	float GetY() const { return m_y; }
public:
	static const EventType sk_eventType;
};
class MouseScrollDataBase :public IEventData
{
private:
	const char* m_Name;
	float m_Scroll_x;
	float m_Scroll_y;
public:
	MouseScrollDataBase(float x,float y) :m_Scroll_x(x),m_Scroll_y(y) { m_Name = "Mouse Scroll Event"; }
	virtual const EventType& VGetEventType(void) const { return sk_eventType; }
	virtual const char* GetName(void) const { return m_Name; }
	float GetScrollX() const { return m_Scroll_x; }
	float GetScrollY() const { return m_Scroll_y; }
public:
	static const EventType sk_eventType;
};
class KeyBroadDataBase : public IEventData
{
private:
	const char* m_Name;
	int m_key, m_scancode, m_action, m_mods;
public:
	KeyBroadDataBase(int key, int scancode, int action, int mods) :m_key(key), m_scancode(scancode), m_action(action), m_mods(mods) { m_Name = "Key Broad Event"; }
	virtual const EventType& VGetEventType(void) const { return sk_eventType; }
	virtual const char* GetName(void) const { return m_Name; }
	int GetKey() const { return m_key; }
	int GetScanCode() const { return m_scancode; }
	int GetAction() const { return m_action; }
	int GetMods() const { return m_mods; }
public:
	static const EventType sk_eventType;
};
class FrameSizeDataBase : public IEventData
{
private:
	const char* m_Name;
	int m_width, m_height;
public:
	FrameSizeDataBase(int p_width,int p_height):m_width(p_width),m_height(p_height) { m_Name = "frame size event"; }
	virtual const EventType& VGetEventType(void) const { return sk_eventType; }
	virtual const char* GetName(void) const { return m_Name; }
	int GetWidth() const { return m_width; }
	int GetHeight() const { return m_height; }
public:
	static const EventType sk_eventType;
};
class WindowCloseDataBase : public IEventData
{
private:
	const char* m_Name;
public:
	WindowCloseDataBase() { m_Name = "window close event"; }
	virtual const EventType& VGetEventType(void) const { return sk_eventType; }
	virtual const char* GetName(void) const { return m_Name; }
public:
	static const EventType sk_eventType;
};
class KeyCodeDataBase : public IEventData
{
private:
	const char* m_Name;
	int m_keycode;
public:
	KeyCodeDataBase(int p_keycode) :m_keycode(p_keycode){ m_Name = "key code event"; }
	virtual const EventType& VGetEventType(void) const { return sk_eventType; }
	virtual const char* GetName(void) const { return m_Name; }
	int GetKeyCode() const { return m_keycode; }
public:
	static const EventType sk_eventType;
};
class MouseButtonDataBase : public IEventData
{
private:
	const char* m_Name;
	int m_button, m_action, m_mods;
public:
	MouseButtonDataBase(int p_button, int p_action, int p_mods) : m_button(p_button), m_action(p_action), m_mods(p_mods) { m_Name = "mouse button event"; }
	virtual const EventType& VGetEventType(void) const { return sk_eventType; }
	virtual const char* GetName(void) const { return m_Name; }
	int GetButton() const { return m_button; }
	int GetAction() const { return m_action; }
	int GetMods() const { return m_mods; }
public:
	static const EventType sk_eventType;
};
#endif	//_EVENTS_H_